package com.hanamaki.basic.array;

public class Array08 {

    public static void main(String[] args) {

//       模拟棋盘  原始数组
//        下棋  棋子:0没下子  1:白  2:黑
//        创建一个棋盘  11行  11列
        int[][] array = new int[11][11];
//        模拟下子
        array[1][2] = 1;
        array[2][3] = 2;

        System.out.println("打印原始数组");
        for (int[] ints : array) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }

//        要想 转换为 稀疏数组  就要  想怎么样才能打印稀疏数组的格式
//        稀疏数组  行 = 原始数组中有效值的个数+2
//        稀疏数组  列 = 3
//        原始数组中的有效值的个数 = ?
        System.out.println("获取原始数组中 有效值的  个数");
//        定义一个 count  计数:统计一共有多少个有效值
        int count = 0;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
                    count++;
                }
            }
        }

        System.out.println("有效值的个数为:" + count);


//        找到 有效值的个数后,就可以 创建稀疏数组
        System.out.println("创建稀疏数组");
        Object[][] array1 = new Object[count + 2][3];
        System.out.println("创建稀疏数组的格式");
        array1[0][0] = "行";
        array1[0][1] = "列";
        array1[0][2] = "有效值";
        array1[1][0] = array.length;
        array1[1][1] = array[0].length;
        array1[1][2] = count;


        System.out.println("打印稀疏数组的格式");
        for (Object[] ints : array1) {
            for (Object anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }

//        得到稀疏数组的格式后,将 每个有效值分别存放进稀疏数组中
//        需要遍历原始的数组,非零的值有多少个,存多少行,从第三行开始存  下标为  2
        int line = 2;
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[i].length; j++) {
                if (array[i][j] != 0) {
//                    动态存放行
                    array1[line][0] = i;
                    array1[line][1] = j;
                    array1[line][2] = array[i][j];
//                    当添加完一个有效值之后,换到下一行继续存
                    line++;
                }
            }
        }

        System.out.println("打印转换完成的稀疏数组");
        for (Object[] ints : array1) {
            for (Object anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }

//        稀疏数组还原
        System.out.println("还原稀疏数组");
//        创建一个 二维数组
        int[][] array2 = new int[(int) array1[1][0]][(int) array1[1][1]];

//        遍历 稀疏数组  取有效值的坐标进行赋值
        for (int i = 2; i < array1.length; i++) {
                array2[(int) array1[i][0]][(int) array1[i][1]] = (int) array1[i][2];
        }


        System.out.println("打印原始数组");
        for (int[] ints : array2) {
            for (int anInt : ints) {
                System.out.print(anInt + "\t");
            }
            System.out.println();
        }

    }
}
